#include "ClockSystem.h"

/// <Summary> The instance of this class </Summary>
ClockSystem* ClockSystem::instance = NULL;

////////////////////////////////////////////////////////////////////////////////////////////////////
/// <Summary>	Gets the instance of this class </Summary>
///
/// <Return>	The instance of this class </Return>
////////////////////////////////////////////////////////////////////////////////////////////////////
ClockSystem& ClockSystem::GetInstance()
{
	if(NULL == instance)
	{
		instance = new ClockSystem;
	}
	return *instance;
}

////////////////////////////////////////////////////////////////////////////////////////////////////
/// <Summary>	Deletes the instance of this class </Summary>
////////////////////////////////////////////////////////////////////////////////////////////////////
void ClockSystem::DeleteInstance()
{
	SAFE_DELETE(instance);
}

////////////////////////////////////////////////////////////////////////////////////////////////////
/// <Summary>	Constructor </Summary>
////////////////////////////////////////////////////////////////////////////////////////////////////
ClockSystem::ClockSystem()
{
	start.QuadPart = 0;
	end.QuadPart = 0;
	deltaTime = 0;
	totalTime = 0;
	QueryPerformanceFrequency(&frequency);
}

////////////////////////////////////////////////////////////////////////////////////////////////////
/// <Summary>	Start	</Summary>
///
/// <Remarks>	
///		This function begins the timer and must be called before End
///	</Remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
void ClockSystem::FrameStart()
{
	QueryPerformanceCounter(&start);
}


////////////////////////////////////////////////////////////////////////////////////////////////////
/// <Summary>	End	</Summary>
///
/// <Remarks>	
///		This function stops the timer and must be called after Start. The delta value will
///		be saved when this function is called.
///	</Remarks>
////////////////////////////////////////////////////////////////////////////////////////////////////
void ClockSystem::FrameEnd()
{
	QueryPerformanceCounter(&end);

	LARGE_INTEGER time;
	time.QuadPart = end.QuadPart - start.QuadPart;
	deltaTime = ((double)time.QuadPart / (double)frequency.QuadPart);

	totalTime += deltaTime;
}

////////////////////////////////////////////////////////////////////////////////////////////////////
/// <Summary>	Reset	</Summary>
////////////////////////////////////////////////////////////////////////////////////////////////////
void ClockSystem::Reset()
{
	start.QuadPart = 0;
	end.QuadPart = 0;
	deltaTime = 0;
	totalTime = 0;
	QueryPerformanceFrequency(&frequency);
}